#include <SPI.h>

// 定义闪存芯片的引脚
#define SS_PIN 10

void setup() {
  Serial.begin(9600);
  SPI.begin();
  
  // 初始化闪存芯片
  pinMode(SS_PIN, OUTPUT);
  digitalWrite(SS_PIN, HIGH);
  
  // 检测闪存芯片是否存在
  if (flashDetect()) {
    Serial.println("Flash chip detected.");
  } else {
    Serial.println("Flash chip not detected.");
    while (1);
  }
}

void loop() {
  // 读取闪存芯片中的数据
  uint32_t address = 0x000000;  // 读取数据的起始地址
  uint8_t data[32];             // 读取的数据缓冲区
  flashRead(address, data, sizeof(data));

  // 打印读取的数据
  for (int i = 0; i < sizeof(data); i++) {
    Serial.print(data[i]);
    Serial.print(" ");
  }
  Serial.println();
  
  delay(1000);
}

// 检测闪存芯片是否存在
bool flashDetect() {
  digitalWrite(SS_PIN, LOW);
  SPI.transfer(0x9F);  // 发送读取ID命令
  uint8_t manufacturer = SPI.transfer(0x00);
  uint8_t memoryType = SPI.transfer(0x00);
  uint8_t capacity = SPI.transfer(0x00);
  digitalWrite(SS_PIN, HIGH);
  
  if (manufacturer == 0xEF && memoryType == 0x40 && capacity == 0x18) {
    return true;
  } else {
    return false;
  }
}

// 从闪存芯片中读取数据
void flashRead(uint32_t address, uint8_t* data, size_t length) {
  digitalWrite(SS_PIN, LOW);
  SPI.transfer(0x03);                   // 发送读取命令
  SPI.transfer((address >> 16) & 0xFF); // 发送地址的高位
  SPI.transfer((address >> 8) & 0xFF);  // 发送地址的中位
  SPI.transfer(address & 0xFF);         // 发送地址的低位
  for (int i = 0; i < length; i++) {
    data[i] = SPI.transfer(0x00);        // 读取数据
  }
  digitalWrite(SS_PIN, HIGH);
}